Overwatch heroes Lucio, Wrecking Ball and Soldier 76 in action
Our dataset consists of information on competitive gamers who play the video game Overwatch on Playstation 4. Overwatch is a team-based multiplayer first-person shooter developed and published by Blizzard Entertainment. Overwatch assigns players into two teams of six, with each player selecting from a roster of 30 characters, known as “heroes”, each with a unique style of play whose roles are divided into three general categories that fit their role. Players on a team work together to secure and defend control points on a map or escort a payload across the map in a limited amount of time.
Overwatch has a large community and E-Sports presence online. Players’ skill in competitive games is calculated by a “secret” formula at Blizzard that leads to a “skill rating”, or “SR” for short. SR ranges from 0 to 5,000, the higher the score the better the player.
Among the community, SR is divided into categories depending on how high the rating is, ranging from Bronze to Grandmaster:
Overwatch pairs two teams up against each other in a match, or game. Each team has six members who must each choose a unique character, called a “hero”. More on that later. The goal is to damage the other team and help keep your team protected. In addition to damaging the other team’s players, the team has an “objective” to complete, which varies from map to map. A “map” here refers to a setting where a match takes place. The objective in Overwatch typically depends on members from one team being located in a specific area, refered to as the objective, while the other team isn’t in that same area. While in the objective area, your team accrues time spent on the objective. If your team accrues enough time, you win the match. It’s a little more complicated than this but that’s essentially it.
Holding down an objecitve area is where damaging your opponent comes in to play. When the other team tries to get on the objective at the same time as your team, you deal them damage to keep them away. Hopefully do enough that the opponent “dies”. But don’t worry, Overwatch is what’s called a “respawn” game. After a player “dies” from taking too much damage, they must wait a few seconds and then they rejoin the game and try again to take the objective from the other team.
We scraped a snapshot of PS4 players’ SR (it changes from game to game) whose profiles were public on overwatchtracker.com. We then scraped players’ career statistics from the games that they’ve played from the open source API ovrstat.com which returns convenient JSON formatted data.
Currently we have over two thousand player skill ratings and over two thousand predictor variables. However, our research question will allow us to tailor our question to a small subset of the predictors, around 60 or so.
Overall we’re interested in the question: if a player wants to improve their SR, what should they focus on? Should they try to eliminate more opponents? Heal their teammates? Or, play a certain character? Answers like these will be provided by a predictive model of SR using career player statistics as predictors. The answers we find will allow any player to most efficiently improve their SR and begin climbing their way to Grandmaster!
The answers we find could be used by amateurs and pro Overwatch gamers alike. We think of our analysis as the start of something like “Moneyball” for Overwatch.
df = read_csv('clean-data.csv')
Here we releved our factor variable to use the character Reinhardt as the reference level. Reinhardt is the most popular hero used in the game and would be a good baseline to use for comparison.
Let’s explore the data a bit more…
df %>% glimpse()
## Observations: 2,316
## Variables: 61
## $ skill_rating <dbl> 2535, 3815, 2909, 1735, 2…
## $ assists.defensiveAssists <dbl> 208, 26, 5, 557, 412, 0, …
## $ assists.healingDone <dbl> 113872, 461978, 16315, 33…
## $ assists.offensiveAssists <dbl> 16, 683, 30, 303, 448, 8,…
## $ average.allDamageDoneAvgPer10Min <dbl> 10696, 11647, 10539, 7440…
## $ average.barrierDamageDoneAvgPer10Min <dbl> 2132, 4929, 2498, 2264, 3…
## $ average.deathsAvgPer10Min <dbl> 7.41, 6.47, 8.67, 6.89, 8…
## $ average.eliminationsAvgPer10Min <dbl> 22.31, 20.30, 20.87, 18.1…
## $ average.finalBlowsAvgPer10Min <dbl> 12.76, 11.25, 13.11, 6.18…
## $ average.healingDoneAvgPer10Min <dbl> 878.00, 4094.00, 500.00, …
## $ average.heroDamageDoneAvgPer10Min <dbl> 8223, 6490, 7773, 4977, 6…
## $ average.objectiveKillsAvgPer10Min <dbl> 9.18, 8.15, 6.62, 8.69, 8…
## $ average.objectiveTimeAvgPer10Min <dbl> 52, 78, 39, 76, 72, 45, 8…
## $ average.soloKillsAvgPer10Min <dbl> 3.53, 2.14, 3.34, 1.10, 2…
## $ average.timeSpentOnFireAvgPer10Min <dbl> 76, 76, 68, 69, 55, 154, …
## $ best.allDamageDoneMostInGame <dbl> 27906, 29403, 19787, 1565…
## $ best.barrierDamageDoneMostInGame <dbl> 12549, 14998, 6376, 7599,…
## $ best.defensiveAssistsMostInGame <dbl> 10, 20, 2, 29, 36, 0, 35,…
## $ best.eliminationsMostInGame <dbl> 60, 56, 40, 40, 52, 24, 6…
## $ best.environmentalKillsMostInGame <dbl> 1, 5, 2, 4, 2, 0, 2, 1, 2…
## $ best.finalBlowsMostInGame <dbl> 36, 30, 30, 17, 35, 12, 3…
## $ best.healingDoneMostInGame <dbl> 3354, 9320, 3072, 13869, …
## $ best.heroDamageDoneMostInGame <dbl> 20399, 17370, 14664, 1038…
## $ best.killsStreakBest <dbl> 60, 56, 40, 40, 52, 24, 6…
## $ best.meleeFinalBlowsMostInGame <dbl> 4, 5, 3, 1, 1, 3, 7, 5, 2…
## $ best.multikillsBest <dbl> 4, 3, 4, 3, 5, 3, 4, 4, 3…
## $ best.objectiveKillsMostInGame <dbl> 30, 35, 18, 23, 29, 9, 31…
## $ best.objectiveTimeMostInGame <dbl> 280, 377, 169, 257, 369, …
## $ best.offensiveAssistsMostInGame <dbl> 5, 46, 13, 27, 21, 8, 20,…
## $ best.soloKillsMostInGame <dbl> 36, 30, 30, 17, 35, 12, 3…
## $ best.teleporterPadsDestroyedMostInGame <dbl> 1, 1, 0, 0, 3, 0, 1, 1, 3…
## $ best.timeSpentOnFireMostInGame <dbl> 482, 353, 305, 307, 518, …
## $ best.turretsDestroyedMostInGame <dbl> 22, 11, 3, 11, 9, 0, 4, 1…
## $ combat.barrierDamageDone <dbl> 276462, 556147, 81535, 12…
## $ combat.damageDone <dbl> 1066469, 732220, 253681, …
## $ combat.deaths <dbl> 961, 730, 283, 368, 1064,…
## $ combat.eliminations <dbl> 2894, 2291, 681, 967, 228…
## $ combat.environmentalKills <dbl> 1, 32, 3, 9, 20, 0, 5, 2,…
## $ combat.finalBlows <dbl> 1655, 1269, 428, 330, 102…
## $ combat.heroDamageDone <dbl> 1066469, 732220, 253681, …
## $ combat.meleeFinalBlows <dbl> 33, 153, 4, 4, 2, 3, 29, …
## $ combat.multikills <dbl> 24, 11, 6, 4, 30, 1, 4, 1…
## $ combat.objectiveKills <dbl> 1190, 920, 216, 464, 1040…
## $ combat.objectiveTime <dbl> 6692, 8793, 1263, 4066, 9…
## $ combat.soloKills <dbl> 458, 241, 109, 59, 266, 3…
## $ combat.timeSpentOnFire <dbl> 9869, 8592, 2217, 3660, 6…
## $ game.gamesLost <dbl> 55, 59, 14, 21, 56, 0, 14…
## $ game.gamesTied <dbl> 3, 2, 1, 0, 3, 0, 0, 2, 0…
## $ game.gamesWon <dbl> 56, 41, 13, 29, 53, 1, 20…
## $ matchAwards.cards <dbl> 58, 26, 7, 27, 29, 1, 11,…
## $ matchAwards.medals <dbl> 354, 395, 68, 143, 269, 5…
## $ matchAwards.medalsBronze <dbl> 97, 143, 20, 41, 95, 2, 4…
## $ matchAwards.medalsGold <dbl> 169, 112, 33, 54, 83, 2, …
## $ matchAwards.medalsSilver <dbl> 88, 140, 15, 48, 91, 1, 4…
## $ miscellaneous.teleporterPadsDestroyed <dbl> 5, 4, 0, 0, 9, 0, 1, 1, 3…
## $ miscellaneous.turretsDestroyed <dbl> 134, 59, 16, 67, 74, 0, 2…
## $ assists.reconAssists <dbl> 2, 0, 1, 0, 4, 0, 0, 2, 0…
## $ best.reconAssistsMostInGame <dbl> 2, 0, 1, 0, 4, 0, 0, 2, 0…
## $ top_hero <fct> soldier76, roadhog, mccre…
## $ games_played <dbl> 114, 61, 79, 104, 193, 67…
## $ top_hero_type <chr> "damage", "tank", "damage…
df %>% summary()
## skill_rating assists.defensiveAssists assists.healingDone
## Min. :1051 Min. : 0.0 Min. : 0
## 1st Qu.:2233 1st Qu.: 25.0 1st Qu.: 17430
## Median :2570 Median : 113.0 Median : 65304
## Mean :2587 Mean : 285.9 Mean : 154075
## 3rd Qu.:2917 3rd Qu.: 328.0 3rd Qu.: 184397
## Max. :4416 Max. :11406.0 Max. :6412326
##
## assists.offensiveAssists average.allDamageDoneAvgPer10Min
## Min. : 0.0 Min. : 0
## 1st Qu.: 23.0 1st Qu.: 6871
## Median : 84.0 Median : 8704
## Mean : 180.0 Mean : 8582
## 3rd Qu.: 222.2 3rd Qu.:10331
## Max. :2809.0 Max. :21925
##
## average.barrierDamageDoneAvgPer10Min average.deathsAvgPer10Min
## Min. : 0 Min. : 0.000
## 1st Qu.:1830 1st Qu.: 6.730
## Median :2552 Median : 7.460
## Mean :2640 Mean : 7.503
## 3rd Qu.:3348 3rd Qu.: 8.230
## Max. :9885 Max. :15.740
##
## average.eliminationsAvgPer10Min average.finalBlowsAvgPer10Min
## Min. : 0.00 Min. : 0.000
## 1st Qu.:14.88 1st Qu.: 5.107
## Median :17.30 Median : 6.920
## Mean :16.82 Mean : 7.135
## 3rd Qu.:19.41 3rd Qu.: 9.015
## Max. :35.36 Max. :26.020
##
## average.healingDoneAvgPer10Min average.heroDamageDoneAvgPer10Min
## Min. : 0 Min. : 0
## 1st Qu.: 1025 1st Qu.: 4644
## Median : 2213 Median : 5772
## Mean : 2872 Mean : 5676
## 3rd Qu.: 4184 3rd Qu.: 6734
## Max. :13199 Max. :13439
##
## average.objectiveKillsAvgPer10Min average.objectiveTimeAvgPer10Min
## Min. : 0.000 Min. : 0.00
## 1st Qu.: 6.268 1st Qu.: 60.00
## Median : 7.465 Median : 75.00
## Mean : 7.336 Mean : 76.86
## 3rd Qu.: 8.530 3rd Qu.: 93.00
## Max. :18.200 Max. :229.00
##
## average.soloKillsAvgPer10Min average.timeSpentOnFireAvgPer10Min
## Min. :0.000 Min. : 0.00
## 1st Qu.:0.640 1st Qu.: 35.00
## Median :1.140 Median : 53.00
## Mean :1.369 Mean : 54.66
## 3rd Qu.:1.900 3rd Qu.: 69.25
## Max. :8.970 Max. :355.00
##
## best.allDamageDoneMostInGame best.barrierDamageDoneMostInGame
## Min. : 0 Min. : 0
## 1st Qu.:16373 1st Qu.: 6004
## Median :22157 Median : 9410
## Mean :22232 Mean : 9601
## 3rd Qu.:27594 3rd Qu.:12682
## Max. :69929 Max. :40390
##
## best.defensiveAssistsMostInGame best.eliminationsMostInGame
## Min. : 0.00 Min. : 0.00
## 1st Qu.:13.00 1st Qu.:34.00
## Median :26.00 Median :42.00
## Mean :25.52 Mean :41.35
## 3rd Qu.:37.00 3rd Qu.:50.00
## Max. :85.00 Max. :91.00
##
## best.environmentalKillsMostInGame best.finalBlowsMostInGame
## Min. : 0.000 Min. : 0.0
## 1st Qu.: 0.000 1st Qu.:14.0
## Median : 1.000 Median :20.0
## Mean : 1.488 Mean :20.4
## 3rd Qu.: 2.000 3rd Qu.:26.0
## Max. :11.000 Max. :56.0
##
## best.healingDoneMostInGame best.heroDamageDoneMostInGame
## Min. : 0 Min. : 0
## 1st Qu.: 6339 1st Qu.:10599
## Median :11944 Median :13842
## Mean :11538 Mean :13968
## 3rd Qu.:16354 3rd Qu.:17333
## Max. :33089 Max. :35887
##
## best.killsStreakBest best.meleeFinalBlowsMostInGame best.multikillsBest
## Min. : 0.00 Min. :0.000 Min. :0.000
## 1st Qu.:34.00 1st Qu.:1.000 1st Qu.:3.000
## Median :42.00 Median :1.000 Median :4.000
## Mean :41.35 Mean :1.503 Mean :3.207
## 3rd Qu.:50.00 3rd Qu.:2.000 3rd Qu.:4.000
## Max. :91.00 Max. :8.000 Max. :6.000
##
## best.objectiveKillsMostInGame best.objectiveTimeMostInGame
## Min. : 0.00 Min. : 0.0
## 1st Qu.:17.00 1st Qu.:177.0
## Median :22.00 Median :259.0
## Mean :21.96 Mean :267.6
## 3rd Qu.:27.00 3rd Qu.:345.0
## Max. :56.00 Max. :776.0
##
## best.offensiveAssistsMostInGame best.soloKillsMostInGame
## Min. : 0.00 Min. : 0.0
## 1st Qu.: 9.00 1st Qu.:14.0
## Median :15.00 Median :20.0
## Mean :15.86 Mean :20.4
## 3rd Qu.:22.00 3rd Qu.:26.0
## Max. :59.00 Max. :56.0
##
## best.teleporterPadsDestroyedMostInGame best.timeSpentOnFireMostInGame
## Min. :0.0000 Min. : 0.0
## 1st Qu.:0.0000 1st Qu.:184.0
## Median :0.0000 Median :296.0
## Mean :0.7539 Mean :298.3
## 3rd Qu.:1.0000 3rd Qu.:410.0
## Max. :6.0000 Max. :938.0
##
## best.turretsDestroyedMostInGame combat.barrierDamageDone
## Min. : 0.000 Min. : 0
## 1st Qu.: 3.000 1st Qu.: 25613
## Median : 6.000 Median : 74947
## Mean : 6.633 Mean : 147924
## 3rd Qu.:10.000 3rd Qu.: 187504
## Max. :29.000 Max. :1943961
##
## combat.damageDone combat.deaths combat.eliminations
## Min. : 0 Min. : 0.0 Min. : 0.0
## 1st Qu.: 59714 1st Qu.: 86.0 1st Qu.: 186.0
## Median : 163050 Median : 226.0 Median : 515.0
## Mean : 320381 Mean : 404.9 Mean : 946.4
## 3rd Qu.: 404488 3rd Qu.: 529.0 3rd Qu.: 1204.0
## Max. :3774790 Max. :4501.0 Max. :11197.0
##
## combat.environmentalKills combat.finalBlows combat.heroDamageDone
## Min. : 0.000 Min. : 0.0 Min. : 0
## 1st Qu.: 0.000 1st Qu.: 69.0 1st Qu.: 59714
## Median : 2.000 Median : 201.0 Median : 163050
## Mean : 5.305 Mean : 406.8 Mean : 320381
## 3rd Qu.: 6.000 3rd Qu.: 492.0 3rd Qu.: 404488
## Max. :103.000 Max. :5924.0 Max. :3774790
##
## combat.meleeFinalBlows combat.multikills combat.objectiveKills
## Min. : 0.000 Min. : 0.00 Min. : 0.0
## 1st Qu.: 1.000 1st Qu.: 1.00 1st Qu.: 82.0
## Median : 3.000 Median : 5.00 Median : 223.0
## Mean : 9.567 Mean : 10.17 Mean : 411.5
## 3rd Qu.: 11.000 3rd Qu.: 12.00 3rd Qu.: 534.2
## Max. :232.000 Max. :144.00 Max. :6059.0
##
## combat.objectiveTime combat.soloKills combat.timeSpentOnFire
## Min. : 0.0 Min. : 0 Min. : 0
## 1st Qu.: 869.8 1st Qu.: 10 1st Qu.: 538
## Median : 2303.5 Median : 32 Median : 1574
## Mean : 4212.1 Mean : 78 Mean : 3152
## 3rd Qu.: 5661.2 3rd Qu.: 89 3rd Qu.: 4007
## Max. :57495.0 Max. :1674 Max. :46230
##
## game.gamesLost game.gamesTied game.gamesWon matchAwards.cards
## Min. : 0.0 Min. : 0.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 5.0 1st Qu.: 0.00 1st Qu.: 5.00 1st Qu.: 3.00
## Median : 13.0 Median : 0.00 Median : 13.00 Median : 9.00
## Mean : 22.6 Mean : 1.12 Mean : 23.07 Mean : 16.26
## 3rd Qu.: 29.0 3rd Qu.: 2.00 3rd Qu.: 31.00 3rd Qu.: 21.00
## Max. :264.0 Max. :14.00 Max. :265.00 Max. :336.00
##
## matchAwards.medals matchAwards.medalsBronze matchAwards.medalsGold
## Min. : 0.0 Min. : 0.00 Min. : 0.00
## 1st Qu.: 26.0 1st Qu.: 8.00 1st Qu.: 8.00
## Median : 67.5 Median : 20.50 Median : 22.50
## Mean : 121.0 Mean : 38.09 Mean : 42.67
## 3rd Qu.: 155.0 3rd Qu.: 49.00 3rd Qu.: 53.00
## Max. :1477.0 Max. :392.00 Max. :728.00
##
## matchAwards.medalsSilver miscellaneous.teleporterPadsDestroyed
## Min. : 0.00 Min. : 0.000
## 1st Qu.: 8.75 1st Qu.: 0.000
## Median : 22.00 Median : 0.000
## Mean : 40.23 Mean : 1.724
## 3rd Qu.: 53.00 3rd Qu.: 2.000
## Max. :409.00 Max. :56.000
##
## miscellaneous.turretsDestroyed assists.reconAssists
## Min. : 0.00 Min. : 0.000
## 1st Qu.: 5.00 1st Qu.: 0.000
## Median : 18.00 Median : 0.000
## Mean : 37.48 Mean : 2.877
## 3rd Qu.: 46.00 3rd Qu.: 4.000
## Max. :746.00 Max. :35.000
##
## best.reconAssistsMostInGame top_hero games_played
## Min. : 0.0 reinhardt: 221 Min. : 11
## 1st Qu.: 0.0 moira : 201 1st Qu.: 39
## Median : 0.0 mercy : 155 Median : 72
## Mean : 2.3 lucio : 154 Mean :104
## 3rd Qu.: 4.0 orisa : 142 3rd Qu.:133
## Max. :30.0 dVa : 131 Max. :672
## (Other) :1312
## top_hero_type
## Length:2316
## Class :character
## Mode :character
##
##
##
##
The main question we want to tackle is: what explains the variation in skill_rating? Let’s first look at the distribution of skill_rating.
Above is a normalized (to sum to 1) histogram of the reponse we want to model skill_rating. It appears that skill_rating (blue bars) looks a lot like a normal distribution (the orange line). This is a good thing, as this makes it easier to adhere to the assumptions of linear regression model we will use to explain the variation in player skill.
At the time of the analysis, there are 30 heroes in Overwatch to choose from. Each hero has a unique play style. There are three types of heroes which determine the play style: Tank, Damage, or Support. Tank heroes can take a lot of damage and typically protect their teammates while trying to remain on the objective area. Damage heroes have the ability to do the most damage to the opposition. They have lower health than Tank heroes, meaning they can “die” more easily.
Lastly, there are Support heroes. These heroes typically have the least health and do the least amount of damage to opponents. Instead of holding down an objective or damaging opponents, Support heroes main job to restore the health of their teammates, which is their primary special role on the team. That being said, all heroes can do damage and a really good Support player can beat a hard-to-kill tank in the game. You can read more about the heroes here.
First, let’s see which heroes are the most popular to play, and which type of hero they are:
Reinhardt, a Tank, and Moira, a Support hero, are by far the two most popular choices in competitive Overwatch games on Playstation. Overall, Damage heroes are less often a player’s most-played character according the career stats data above. One reason for this is that, in competitive matches, strategy and special abilities like healing teammates are more important simply damaging your opponents. For example, the most popular hero Reinhardt has the largest shield in the game which all of his other teammates can stand behind and be protected from opposition damage. This is really useful when trying to remain on the objective area and keeping the other team out.
Here we see that the Tank and Support type heroes are more popular than the Damage heroes. Reinhardt was the most popular tank during the open beta and it appears his popularity remains strong. Ana is considered one of the most difficult heroes to play and master. The game developers may be interested to dig deeper to find out why Pharah is the least popular. Perhaps it’s because she’s an easy target for skilled players to hit, has only an average amount of health and cannot heal herself.
We’ll start to understand what predicts skill_rating by using all available predictors, including the most popular hero got a given player shown in the chart above.
We start with a basic additive model to get a sense of our data and to explore potential issues. Let’s see if our assumptions of linear regression hold true (LINE).
fit_add_full = lm(skill_rating ~ . -top_hero_type, data = df)
diagnostics(fit_add_full, testit = FALSE)
(fm_diag = diagnostics(fit_add_full, plotit = FALSE))
## $p_val
## [1] 1.079526e-08
##
## $decision
## [1] "Reject"
fm_bp = bptest(fit_add_full)
fm_bp
##
## studentized Breusch-Pagan test
##
## data: fit_add_full
## BP = 163.24, df = 84, p-value = 5.079e-07
Our full additive model fails both the Shapiro-Wilk and Bruesch-Pagan test. We reject the null hypothesis in the Shapiro-Wilk test which means that there is only a small probability that the data could have been sampled from a normal distribution.
Also, we reject the null of homoscedasticity, which means that the constant variance assumption is violated.
There are two major problems in the full additive model: heteroskedasticity and non-normal residuals. We can try to find the correct model and apply transformations to the predictors. Or, what we’ll do instead is think more carefully about the predictors and hand-pick a smaller model to start with based on exploratory data analysis and our knowledge of Overwatch.
Let’s look at the collinearity of our predictor variables.
pair_vars = c("best.meleeFinalBlowsMostInGame",
"best.offensiveAssistsMostInGame",
"average.objectiveTimeAvgPer10Min",
"average.allDamageDoneAvgPer10Min",
"average.objectiveKillsAvgPer10Min",
"games_played",
"skill_rating")
pairs(df[pair_vars])
These pairwise plots look good. The average.allDamageDoneAvgPer10Min and average.objectiveKillsAvgPer10Min predictors appear to be slightly correlated but doesn’t seem strong enough to remove one.
find_cor_sr <- function(data){
M <- cor(data %>% select_if(is.numeric))
M[row.names(M) == 'skill_rating', !(colnames(M) %in% c('rank', 'skill_rating'))]
}
linear_cors = find_cor_sr(df)
The five most positively correlated variables with skill_rating are: best.meleeFinalBlowsMostInGame, best.offensiveAssistsMostInGame, average.barrierDamageDoneAvgPer10Min, average.allDamageDoneAvgPer10Min, combat.meleeFinalBlows.
Among the most positively correlated variables there are some redundant variables. For example, best.meleeFinalBlowsMostInGame and combat.meleeFinalBlows are both measures of how many melees a player does in a game that “killed” an opponent hero. They are highly correlated, with a correlation coefficient of 0.6548119. So we only need to keep the more correlated variable in our next model.
Another conceptually redundant pair of variables is average.allDamageDoneAvgPer10Min and average.barrierDamageDoneAvgPer10Min. average.allDamageDoneAvgPer10Min is more interpretable than average.barrierDamageDoneAvgPer10Min. That’s because when you average a lot of damage output per 10 minutes, and there happens to be a barrier you’re damaging (for example, Reinhardt’s shield), then average.barrierDamageDoneAvgPer10Min is just a side effect of damage output. And this is seen in the data, these two variables are highly correlated, with a corrleation of 0.8441916.
The two most negatively correlated variables with skill_rating are: average.objectiveTimeAvgPer10Min, average.objectiveKillsAvgPer10Min.
Again, these two variables are conceptually very similar so we only need to keep one in the next model: average.objectiveKillsAvgPer10Min. average.objectiveKillsAvgPer10Min is more actionable than average.objectiveTimeAvgPer10Min since it’s more specific about what to do when a player is on the objective area, get “kills”.
A player may need to get better to improve their “average” statistics laid out in the correlated variables above. But one thing any player can always do is play more. So we also want to consider the number of games played as a predictor of skill_rating as it’s both actionable and an obvious variable to control for, i.e. are the most skilled just those who have played the most?
par(mfrow=c(1,2))
plot(skill_rating ~ games_played, data = df)
plot(skill_rating ~ log(games_played), data = df)
We can see that the natural log transform of games_played makes the positive relationship with skill_rating easier to see and brings in the long tail of players who have played many more games than the median player. This will help prevent heteroskedasticity with this predictor in the linear model. The correlation between games_played and skill_rating is 0.1080446.
Now, using the predictors we’ve identifed we run a backwards search starting with all of the predictors in the model.
df_final = df %>% select(one_of(c(pair_vars, 'top_hero')))
fit = lm(skill_rating ~ top_hero : . + ., data = df_final)
summary(fit)
##
## Call:
## lm(formula = skill_rating ~ top_hero:. + ., data = df_final)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1530.2 -276.9 -3.7 270.6 1684.1
##
## Coefficients:
## Estimate
## (Intercept) 1.685e+03
## top_heroana 1.089e+03
## top_heroashe 8.176e+02
## top_herobaptiste 3.348e+02
## top_herobastion -3.530e+02
## top_herobrigitte 5.428e+02
## top_herodoomfist 5.160e+02
## top_herodVa 9.994e+01
## top_herogenji 4.120e+01
## top_herohanzo -1.444e+01
## top_herojunkrat -2.117e+02
## top_herolucio 8.322e+02
## top_heromccree 5.965e+02
## top_heromei -1.215e+01
## top_heromercy 7.476e+02
## top_heromoira 6.055e+02
## top_heroorisa -2.623e+02
## top_heropharah -2.760e+02
## top_heroreaper 2.015e+02
## top_heroroadhog 8.687e+01
## top_herosoldier76 9.044e+02
## top_herosombra 4.393e+02
## top_herosymmetra 1.396e+03
## top_herotorbjorn 2.375e+02
## top_herotracer 2.692e+02
## top_herowidowmaker -1.997e+02
## top_herowinston -1.211e+03
## top_herowreckingBall 8.095e+02
## top_herozarya 1.675e+02
## top_herozenyatta 3.066e+01
## best.meleeFinalBlowsMostInGame 4.664e+01
## best.offensiveAssistsMostInGame 1.220e+01
## average.objectiveTimeAvgPer10Min 2.640e+00
## average.allDamageDoneAvgPer10Min 1.090e-01
## average.objectiveKillsAvgPer10Min -7.223e+01
## games_played -1.984e-01
## top_heroana:best.meleeFinalBlowsMostInGame -5.656e+01
## top_heroashe:best.meleeFinalBlowsMostInGame 1.566e+01
## top_herobaptiste:best.meleeFinalBlowsMostInGame -4.851e+01
## top_herobastion:best.meleeFinalBlowsMostInGame 2.148e+02
## top_herobrigitte:best.meleeFinalBlowsMostInGame 1.203e+02
## top_herodoomfist:best.meleeFinalBlowsMostInGame -2.954e+01
## top_herodVa:best.meleeFinalBlowsMostInGame -2.605e+01
## top_herogenji:best.meleeFinalBlowsMostInGame -4.821e+01
## top_herohanzo:best.meleeFinalBlowsMostInGame -2.325e+01
## top_herojunkrat:best.meleeFinalBlowsMostInGame -5.447e+01
## top_herolucio:best.meleeFinalBlowsMostInGame -9.885e+00
## top_heromccree:best.meleeFinalBlowsMostInGame -8.513e+01
## top_heromei:best.meleeFinalBlowsMostInGame -9.779e+00
## top_heromercy:best.meleeFinalBlowsMostInGame 7.390e+01
## top_heromoira:best.meleeFinalBlowsMostInGame 5.235e+01
## top_heroorisa:best.meleeFinalBlowsMostInGame 1.185e+02
## top_heropharah:best.meleeFinalBlowsMostInGame -5.055e+01
## top_heroreaper:best.meleeFinalBlowsMostInGame -3.782e+01
## top_heroroadhog:best.meleeFinalBlowsMostInGame -1.859e+01
## top_herosoldier76:best.meleeFinalBlowsMostInGame 7.962e+00
## top_herosombra:best.meleeFinalBlowsMostInGame 2.172e+02
## top_herosymmetra:best.meleeFinalBlowsMostInGame 2.821e+02
## top_herotorbjorn:best.meleeFinalBlowsMostInGame 1.088e+01
## top_herotracer:best.meleeFinalBlowsMostInGame -7.055e+01
## top_herowidowmaker:best.meleeFinalBlowsMostInGame -4.066e+01
## top_herowinston:best.meleeFinalBlowsMostInGame 1.321e+02
## top_herowreckingBall:best.meleeFinalBlowsMostInGame 1.313e+01
## top_herozarya:best.meleeFinalBlowsMostInGame -1.620e+01
## top_herozenyatta:best.meleeFinalBlowsMostInGame 1.838e+02
## top_heroana:best.offensiveAssistsMostInGame -2.418e+00
## top_heroashe:best.offensiveAssistsMostInGame -2.353e+00
## top_herobaptiste:best.offensiveAssistsMostInGame 1.148e+01
## top_herobastion:best.offensiveAssistsMostInGame -2.020e+01
## top_herobrigitte:best.offensiveAssistsMostInGame -1.405e+01
## top_herodoomfist:best.offensiveAssistsMostInGame -6.365e+00
## top_herodVa:best.offensiveAssistsMostInGame 1.861e+00
## top_herogenji:best.offensiveAssistsMostInGame -4.840e-01
## top_herohanzo:best.offensiveAssistsMostInGame 8.823e+00
## top_herojunkrat:best.offensiveAssistsMostInGame -8.229e+00
## top_herolucio:best.offensiveAssistsMostInGame 4.725e+00
## top_heromccree:best.offensiveAssistsMostInGame -5.683e+00
## top_heromei:best.offensiveAssistsMostInGame 2.591e+00
## top_heromercy:best.offensiveAssistsMostInGame 9.691e-01
## top_heromoira:best.offensiveAssistsMostInGame -9.795e+00
## top_heroorisa:best.offensiveAssistsMostInGame -8.022e-01
## top_heropharah:best.offensiveAssistsMostInGame -1.487e+01
## top_heroreaper:best.offensiveAssistsMostInGame 1.945e+00
## top_heroroadhog:best.offensiveAssistsMostInGame 1.145e+01
## top_herosoldier76:best.offensiveAssistsMostInGame 7.180e+00
## top_herosombra:best.offensiveAssistsMostInGame -2.156e+01
## top_herosymmetra:best.offensiveAssistsMostInGame 4.954e+00
## top_herotorbjorn:best.offensiveAssistsMostInGame 1.451e+00
## top_herotracer:best.offensiveAssistsMostInGame -1.253e+01
## top_herowidowmaker:best.offensiveAssistsMostInGame 1.085e+01
## top_herowinston:best.offensiveAssistsMostInGame 1.155e+01
## top_herowreckingBall:best.offensiveAssistsMostInGame -1.723e+01
## top_herozarya:best.offensiveAssistsMostInGame -1.562e+01
## top_herozenyatta:best.offensiveAssistsMostInGame -8.972e+00
## top_heroana:average.objectiveTimeAvgPer10Min -3.648e+00
## top_heroashe:average.objectiveTimeAvgPer10Min -4.293e+00
## top_herobaptiste:average.objectiveTimeAvgPer10Min -1.933e+00
## top_herobastion:average.objectiveTimeAvgPer10Min -9.250e-01
## top_herobrigitte:average.objectiveTimeAvgPer10Min 1.383e+00
## top_herodoomfist:average.objectiveTimeAvgPer10Min 6.401e-01
## top_herodVa:average.objectiveTimeAvgPer10Min -3.945e+00
## top_herogenji:average.objectiveTimeAvgPer10Min -1.901e+00
## top_herohanzo:average.objectiveTimeAvgPer10Min -1.446e+00
## top_herojunkrat:average.objectiveTimeAvgPer10Min 1.826e+00
## top_herolucio:average.objectiveTimeAvgPer10Min -1.078e-01
## top_heromccree:average.objectiveTimeAvgPer10Min -3.558e+00
## top_heromei:average.objectiveTimeAvgPer10Min -4.723e-01
## top_heromercy:average.objectiveTimeAvgPer10Min -2.252e+00
## top_heromoira:average.objectiveTimeAvgPer10Min -4.572e+00
## top_heroorisa:average.objectiveTimeAvgPer10Min 2.282e+00
## top_heropharah:average.objectiveTimeAvgPer10Min 2.730e+01
## top_heroreaper:average.objectiveTimeAvgPer10Min 4.929e+00
## top_heroroadhog:average.objectiveTimeAvgPer10Min -3.646e+00
## top_herosoldier76:average.objectiveTimeAvgPer10Min -3.060e+00
## top_herosombra:average.objectiveTimeAvgPer10Min -7.621e-01
## top_herosymmetra:average.objectiveTimeAvgPer10Min -8.532e+00
## top_herotorbjorn:average.objectiveTimeAvgPer10Min -6.689e+00
## top_herotracer:average.objectiveTimeAvgPer10Min -9.095e+00
## top_herowidowmaker:average.objectiveTimeAvgPer10Min -2.897e+00
## top_herowinston:average.objectiveTimeAvgPer10Min 7.434e+00
## top_herowreckingBall:average.objectiveTimeAvgPer10Min -7.405e+00
## top_herozarya:average.objectiveTimeAvgPer10Min -5.429e+00
## top_herozenyatta:average.objectiveTimeAvgPer10Min -1.038e+01
## top_heroana:average.allDamageDoneAvgPer10Min -6.300e-02
## top_heroashe:average.allDamageDoneAvgPer10Min -5.136e-02
## top_herobaptiste:average.allDamageDoneAvgPer10Min 1.817e-02
## top_herobastion:average.allDamageDoneAvgPer10Min -6.886e-02
## top_herobrigitte:average.allDamageDoneAvgPer10Min 2.201e-02
## top_herodoomfist:average.allDamageDoneAvgPer10Min 1.492e-01
## top_herodVa:average.allDamageDoneAvgPer10Min -2.113e-03
## top_herogenji:average.allDamageDoneAvgPer10Min 9.634e-02
## top_herohanzo:average.allDamageDoneAvgPer10Min 6.399e-02
## top_herojunkrat:average.allDamageDoneAvgPer10Min 6.345e-03
## top_herolucio:average.allDamageDoneAvgPer10Min -3.346e-02
## top_heromccree:average.allDamageDoneAvgPer10Min -2.755e-02
## top_heromei:average.allDamageDoneAvgPer10Min -5.711e-02
## top_heromercy:average.allDamageDoneAvgPer10Min -7.155e-02
## top_heromoira:average.allDamageDoneAvgPer10Min -6.674e-02
## top_heroorisa:average.allDamageDoneAvgPer10Min 6.129e-03
## top_heropharah:average.allDamageDoneAvgPer10Min -3.683e-02
## top_heroreaper:average.allDamageDoneAvgPer10Min -1.250e-02
## top_heroroadhog:average.allDamageDoneAvgPer10Min 4.027e-03
## top_herosoldier76:average.allDamageDoneAvgPer10Min -2.931e-02
## top_herosombra:average.allDamageDoneAvgPer10Min -1.968e-02
## top_herosymmetra:average.allDamageDoneAvgPer10Min -7.515e-02
## top_herotorbjorn:average.allDamageDoneAvgPer10Min 1.326e-02
## top_herotracer:average.allDamageDoneAvgPer10Min -1.485e-02
## top_herowidowmaker:average.allDamageDoneAvgPer10Min 9.889e-02
## top_herowinston:average.allDamageDoneAvgPer10Min 1.862e-01
## top_herowreckingBall:average.allDamageDoneAvgPer10Min -1.992e-02
## top_herozarya:average.allDamageDoneAvgPer10Min 3.963e-02
## top_herozenyatta:average.allDamageDoneAvgPer10Min 1.892e-02
## top_heroana:average.objectiveKillsAvgPer10Min -1.505e+01
## top_heroashe:average.objectiveKillsAvgPer10Min 1.224e+01
## top_herobaptiste:average.objectiveKillsAvgPer10Min -4.013e+01
## top_herobastion:average.objectiveKillsAvgPer10Min 6.563e+01
## top_herobrigitte:average.objectiveKillsAvgPer10Min -9.365e+01
## top_herodoomfist:average.objectiveKillsAvgPer10Min -2.713e+02
## top_herodVa:average.objectiveKillsAvgPer10Min -3.003e-01
## top_herogenji:average.objectiveKillsAvgPer10Min -1.009e+02
## top_herohanzo:average.objectiveKillsAvgPer10Min -9.299e+01
## top_herojunkrat:average.objectiveKillsAvgPer10Min -1.317e+01
## top_herolucio:average.objectiveKillsAvgPer10Min -7.765e+01
## top_heromccree:average.objectiveKillsAvgPer10Min 4.249e+00
## top_heromei:average.objectiveKillsAvgPer10Min 2.349e+01
## top_heromercy:average.objectiveKillsAvgPer10Min -3.418e+01
## top_heromoira:average.objectiveKillsAvgPer10Min 4.862e+01
## top_heroorisa:average.objectiveKillsAvgPer10Min -3.830e+01
## top_heropharah:average.objectiveKillsAvgPer10Min -1.158e+02
## top_heroreaper:average.objectiveKillsAvgPer10Min -6.002e+01
## top_heroroadhog:average.objectiveKillsAvgPer10Min -4.731e-01
## top_herosoldier76:average.objectiveKillsAvgPer10Min -6.950e+01
## top_herosombra:average.objectiveKillsAvgPer10Min -2.619e+01
## top_herosymmetra:average.objectiveKillsAvgPer10Min -1.552e+01
## top_herotorbjorn:average.objectiveKillsAvgPer10Min -2.269e+01
## top_herotracer:average.objectiveKillsAvgPer10Min 8.969e+01
## top_herowidowmaker:average.objectiveKillsAvgPer10Min -7.822e+01
## top_herowinston:average.objectiveKillsAvgPer10Min -1.654e+02
## top_herowreckingBall:average.objectiveKillsAvgPer10Min -2.223e+00
## top_herozarya:average.objectiveKillsAvgPer10Min 3.680e+01
## top_herozenyatta:average.objectiveKillsAvgPer10Min 6.649e+01
## top_heroana:games_played -3.029e-01
## top_heroashe:games_played 2.318e-01
## top_herobaptiste:games_played 7.634e-01
## top_herobastion:games_played 2.908e+00
## top_herobrigitte:games_played 8.713e-01
## top_herodoomfist:games_played 1.021e+00
## top_herodVa:games_played 6.380e-01
## top_herogenji:games_played 1.950e-01
## top_herohanzo:games_played 7.088e-01
## top_herojunkrat:games_played 6.363e-02
## top_herolucio:games_played -1.393e-01
## top_heromccree:games_played 1.013e+00
## top_heromei:games_played 1.225e+00
## top_heromercy:games_played 1.160e+00
## top_heromoira:games_played 1.125e+00
## top_heroorisa:games_played 6.644e-01
## top_heropharah:games_played 2.054e+00
## top_heroreaper:games_played 5.708e-01
## top_heroroadhog:games_played 1.800e-01
## top_herosoldier76:games_played -9.846e-01
## top_herosombra:games_played 1.761e+00
## top_herosymmetra:games_played -9.314e-01
## top_herotorbjorn:games_played 1.426e+00
## top_herotracer:games_played 1.294e-01
## top_herowidowmaker:games_played 7.809e-01
## top_herowinston:games_played 1.679e+00
## top_herowreckingBall:games_played 1.441e+00
## top_herozarya:games_played -2.435e-01
## top_herozenyatta:games_played 4.554e-01
## Std. Error t value
## (Intercept) 2.006e+02 8.398
## top_heroana 2.863e+02 3.804
## top_heroashe 5.010e+02 1.632
## top_herobaptiste 3.621e+02 0.925
## top_herobastion 5.615e+02 -0.629
## top_herobrigitte 4.594e+02 1.181
## top_herodoomfist 6.185e+02 0.834
## top_herodVa 3.051e+02 0.328
## top_herogenji 4.036e+02 0.102
## top_herohanzo 3.870e+02 -0.037
## top_herojunkrat 3.583e+02 -0.591
## top_herolucio 2.974e+02 2.798
## top_heromccree 3.639e+02 1.639
## top_heromei 5.497e+02 -0.022
## top_heromercy 2.647e+02 2.825
## top_heromoira 2.782e+02 2.177
## top_heroorisa 3.493e+02 -0.751
## top_heropharah 6.011e+02 -0.459
## top_heroreaper 3.994e+02 0.505
## top_heroroadhog 3.249e+02 0.267
## top_herosoldier76 4.796e+02 1.886
## top_herosombra 6.038e+02 0.728
## top_herosymmetra 6.667e+02 2.094
## top_herotorbjorn 8.474e+02 0.280
## top_herotracer 6.854e+02 0.393
## top_herowidowmaker 4.058e+02 -0.492
## top_herowinston 1.113e+03 -1.087
## top_herowreckingBall 4.563e+02 1.774
## top_herozarya 3.993e+02 0.419
## top_herozenyatta 3.383e+02 0.091
## best.meleeFinalBlowsMostInGame 2.602e+01 1.793
## best.offensiveAssistsMostInGame 4.160e+00 2.933
## average.objectiveTimeAvgPer10Min 1.542e+00 1.712
## average.allDamageDoneAvgPer10Min 1.961e-02 5.561
## average.objectiveKillsAvgPer10Min 2.486e+01 -2.906
## games_played 3.043e-01 -0.652
## top_heroana:best.meleeFinalBlowsMostInGame 4.793e+01 -1.180
## top_heroashe:best.meleeFinalBlowsMostInGame 9.787e+01 0.160
## top_herobaptiste:best.meleeFinalBlowsMostInGame 5.960e+01 -0.814
## top_herobastion:best.meleeFinalBlowsMostInGame 1.133e+02 1.895
## top_herobrigitte:best.meleeFinalBlowsMostInGame 8.426e+01 1.428
## top_herodoomfist:best.meleeFinalBlowsMostInGame 7.002e+01 -0.422
## top_herodVa:best.meleeFinalBlowsMostInGame 4.362e+01 -0.597
## top_herogenji:best.meleeFinalBlowsMostInGame 4.082e+01 -1.181
## top_herohanzo:best.meleeFinalBlowsMostInGame 5.663e+01 -0.411
## top_herojunkrat:best.meleeFinalBlowsMostInGame 6.211e+01 -0.877
## top_herolucio:best.meleeFinalBlowsMostInGame 4.340e+01 -0.228
## top_heromccree:best.meleeFinalBlowsMostInGame 5.694e+01 -1.495
## top_heromei:best.meleeFinalBlowsMostInGame 6.792e+01 -0.144
## top_heromercy:best.meleeFinalBlowsMostInGame 4.526e+01 1.633
## top_heromoira:best.meleeFinalBlowsMostInGame 4.526e+01 1.157
## top_heroorisa:best.meleeFinalBlowsMostInGame 4.222e+01 2.806
## top_heropharah:best.meleeFinalBlowsMostInGame 2.625e+02 -0.193
## top_heroreaper:best.meleeFinalBlowsMostInGame 5.435e+01 -0.696
## top_heroroadhog:best.meleeFinalBlowsMostInGame 3.909e+01 -0.476
## top_herosoldier76:best.meleeFinalBlowsMostInGame 7.735e+01 0.103
## top_herosombra:best.meleeFinalBlowsMostInGame 9.288e+01 2.339
## top_herosymmetra:best.meleeFinalBlowsMostInGame 1.845e+02 1.529
## top_herotorbjorn:best.meleeFinalBlowsMostInGame 1.010e+02 0.108
## top_herotracer:best.meleeFinalBlowsMostInGame 7.314e+01 -0.965
## top_herowidowmaker:best.meleeFinalBlowsMostInGame 5.239e+01 -0.776
## top_herowinston:best.meleeFinalBlowsMostInGame 1.094e+02 1.207
## top_herowreckingBall:best.meleeFinalBlowsMostInGame 6.845e+01 0.192
## top_herozarya:best.meleeFinalBlowsMostInGame 6.186e+01 -0.262
## top_herozenyatta:best.meleeFinalBlowsMostInGame 5.838e+01 3.149
## top_heroana:best.offensiveAssistsMostInGame 7.978e+00 -0.303
## top_heroashe:best.offensiveAssistsMostInGame 9.977e+00 -0.236
## top_herobaptiste:best.offensiveAssistsMostInGame 8.911e+00 1.288
## top_herobastion:best.offensiveAssistsMostInGame 1.513e+01 -1.336
## top_herobrigitte:best.offensiveAssistsMostInGame 1.020e+01 -1.377
## top_herodoomfist:best.offensiveAssistsMostInGame 1.210e+01 -0.526
## top_herodVa:best.offensiveAssistsMostInGame 6.636e+00 0.280
## top_herogenji:best.offensiveAssistsMostInGame 7.360e+00 -0.066
## top_herohanzo:best.offensiveAssistsMostInGame 8.153e+00 1.082
## top_herojunkrat:best.offensiveAssistsMostInGame 8.629e+00 -0.954
## top_herolucio:best.offensiveAssistsMostInGame 5.967e+00 0.792
## top_heromccree:best.offensiveAssistsMostInGame 8.422e+00 -0.675
## top_heromei:best.offensiveAssistsMostInGame 1.397e+01 0.185
## top_heromercy:best.offensiveAssistsMostInGame 5.803e+00 0.167
## top_heromoira:best.offensiveAssistsMostInGame 5.761e+00 -1.700
## top_heroorisa:best.offensiveAssistsMostInGame 6.425e+00 -0.125
## top_heropharah:best.offensiveAssistsMostInGame 3.162e+01 -0.470
## top_heroreaper:best.offensiveAssistsMostInGame 8.485e+00 0.229
## top_heroroadhog:best.offensiveAssistsMostInGame 7.433e+00 1.540
## top_herosoldier76:best.offensiveAssistsMostInGame 9.731e+00 0.738
## top_herosombra:best.offensiveAssistsMostInGame 1.166e+01 -1.849
## top_herosymmetra:best.offensiveAssistsMostInGame 1.455e+01 0.340
## top_herotorbjorn:best.offensiveAssistsMostInGame 1.685e+01 0.086
## top_herotracer:best.offensiveAssistsMostInGame 1.264e+01 -0.992
## top_herowidowmaker:best.offensiveAssistsMostInGame 9.204e+00 1.178
## top_herowinston:best.offensiveAssistsMostInGame 1.477e+01 0.782
## top_herowreckingBall:best.offensiveAssistsMostInGame 8.944e+00 -1.926
## top_herozarya:best.offensiveAssistsMostInGame 8.614e+00 -1.813
## top_herozenyatta:best.offensiveAssistsMostInGame 6.874e+00 -1.305
## top_heroana:average.objectiveTimeAvgPer10Min 3.001e+00 -1.216
## top_heroashe:average.objectiveTimeAvgPer10Min 4.685e+00 -0.916
## top_herobaptiste:average.objectiveTimeAvgPer10Min 3.486e+00 -0.554
## top_herobastion:average.objectiveTimeAvgPer10Min 5.460e+00 -0.169
## top_herobrigitte:average.objectiveTimeAvgPer10Min 3.170e+00 0.436
## top_herodoomfist:average.objectiveTimeAvgPer10Min 9.387e+00 0.068
## top_herodVa:average.objectiveTimeAvgPer10Min 2.319e+00 -1.701
## top_herogenji:average.objectiveTimeAvgPer10Min 3.534e+00 -0.538
## top_herohanzo:average.objectiveTimeAvgPer10Min 5.065e+00 -0.286
## top_herojunkrat:average.objectiveTimeAvgPer10Min 3.807e+00 0.480
## top_herolucio:average.objectiveTimeAvgPer10Min 2.270e+00 -0.047
## top_heromccree:average.objectiveTimeAvgPer10Min 3.496e+00 -1.018
## top_heromei:average.objectiveTimeAvgPer10Min 5.931e+00 -0.080
## top_heromercy:average.objectiveTimeAvgPer10Min 2.657e+00 -0.848
## top_heromoira:average.objectiveTimeAvgPer10Min 2.434e+00 -1.878
## top_heroorisa:average.objectiveTimeAvgPer10Min 2.332e+00 0.978
## top_heropharah:average.objectiveTimeAvgPer10Min 1.111e+01 2.458
## top_heroreaper:average.objectiveTimeAvgPer10Min 4.471e+00 1.103
## top_heroroadhog:average.objectiveTimeAvgPer10Min 2.822e+00 -1.292
## top_herosoldier76:average.objectiveTimeAvgPer10Min 5.580e+00 -0.548
## top_herosombra:average.objectiveTimeAvgPer10Min 6.892e+00 -0.111
## top_herosymmetra:average.objectiveTimeAvgPer10Min 7.213e+00 -1.183
## top_herotorbjorn:average.objectiveTimeAvgPer10Min 8.248e+00 -0.811
## top_herotracer:average.objectiveTimeAvgPer10Min 5.231e+00 -1.739
## top_herowidowmaker:average.objectiveTimeAvgPer10Min 4.542e+00 -0.638
## top_herowinston:average.objectiveTimeAvgPer10Min 9.922e+00 0.749
## top_herowreckingBall:average.objectiveTimeAvgPer10Min 3.235e+00 -2.289
## top_herozarya:average.objectiveTimeAvgPer10Min 2.806e+00 -1.935
## top_herozenyatta:average.objectiveTimeAvgPer10Min 3.423e+00 -3.033
## top_heroana:average.allDamageDoneAvgPer10Min 3.928e-02 -1.604
## top_heroashe:average.allDamageDoneAvgPer10Min 4.076e-02 -1.260
## top_herobaptiste:average.allDamageDoneAvgPer10Min 4.445e-02 0.409
## top_herobastion:average.allDamageDoneAvgPer10Min 3.980e-02 -1.730
## top_herobrigitte:average.allDamageDoneAvgPer10Min 4.284e-02 0.514
## top_herodoomfist:average.allDamageDoneAvgPer10Min 6.996e-02 2.133
## top_herodVa:average.allDamageDoneAvgPer10Min 3.142e-02 -0.067
## top_herogenji:average.allDamageDoneAvgPer10Min 3.808e-02 2.530
## top_herohanzo:average.allDamageDoneAvgPer10Min 4.101e-02 1.561
## top_herojunkrat:average.allDamageDoneAvgPer10Min 3.385e-02 0.187
## top_herolucio:average.allDamageDoneAvgPer10Min 3.368e-02 -0.993
## top_heromccree:average.allDamageDoneAvgPer10Min 3.406e-02 -0.809
## top_heromei:average.allDamageDoneAvgPer10Min 5.955e-02 -0.959
## top_heromercy:average.allDamageDoneAvgPer10Min 3.748e-02 -1.909
## top_heromoira:average.allDamageDoneAvgPer10Min 2.894e-02 -2.306
## top_heroorisa:average.allDamageDoneAvgPer10Min 2.786e-02 0.220
## top_heropharah:average.allDamageDoneAvgPer10Min 6.887e-02 -0.535
## top_heroreaper:average.allDamageDoneAvgPer10Min 3.534e-02 -0.354
## top_heroroadhog:average.allDamageDoneAvgPer10Min 2.934e-02 0.137
## top_herosoldier76:average.allDamageDoneAvgPer10Min 4.399e-02 -0.666
## top_herosombra:average.allDamageDoneAvgPer10Min 6.543e-02 -0.301
## top_herosymmetra:average.allDamageDoneAvgPer10Min 6.756e-02 -1.112
## top_herotorbjorn:average.allDamageDoneAvgPer10Min 5.400e-02 0.245
## top_herotracer:average.allDamageDoneAvgPer10Min 5.872e-02 -0.253
## top_herowidowmaker:average.allDamageDoneAvgPer10Min 4.265e-02 2.319
## top_herowinston:average.allDamageDoneAvgPer10Min 1.075e-01 1.733
## top_herowreckingBall:average.allDamageDoneAvgPer10Min 5.646e-02 -0.353
## top_herozarya:average.allDamageDoneAvgPer10Min 3.578e-02 1.108
## top_herozenyatta:average.allDamageDoneAvgPer10Min 3.816e-02 0.496
## top_heroana:average.objectiveKillsAvgPer10Min 5.034e+01 -0.299
## top_heroashe:average.objectiveKillsAvgPer10Min 5.854e+01 0.209
## top_herobaptiste:average.objectiveKillsAvgPer10Min 5.265e+01 -0.762
## top_herobastion:average.objectiveKillsAvgPer10Min 6.479e+01 1.013
## top_herobrigitte:average.objectiveKillsAvgPer10Min 5.967e+01 -1.569
## top_herodoomfist:average.objectiveKillsAvgPer10Min 1.344e+02 -2.019
## top_herodVa:average.objectiveKillsAvgPer10Min 3.924e+01 -0.008
## top_herogenji:average.objectiveKillsAvgPer10Min 5.933e+01 -1.701
## top_herohanzo:average.objectiveKillsAvgPer10Min 5.726e+01 -1.624
## top_herojunkrat:average.objectiveKillsAvgPer10Min 4.308e+01 -0.306
## top_herolucio:average.objectiveKillsAvgPer10Min 3.748e+01 -2.072
## top_heromccree:average.objectiveKillsAvgPer10Min 4.184e+01 0.102
## top_heromei:average.objectiveKillsAvgPer10Min 7.045e+01 0.333
## top_heromercy:average.objectiveKillsAvgPer10Min 4.579e+01 -0.746
## top_heromoira:average.objectiveKillsAvgPer10Min 3.173e+01 1.532
## top_heroorisa:average.objectiveKillsAvgPer10Min 3.911e+01 -0.979
## top_heropharah:average.objectiveKillsAvgPer10Min 6.578e+01 -1.760
## top_heroreaper:average.objectiveKillsAvgPer10Min 5.265e+01 -1.140
## top_heroroadhog:average.objectiveKillsAvgPer10Min 4.099e+01 -0.012
## top_herosoldier76:average.objectiveKillsAvgPer10Min 6.376e+01 -1.090
## top_herosombra:average.objectiveKillsAvgPer10Min 8.660e+01 -0.302
## top_herosymmetra:average.objectiveKillsAvgPer10Min 6.259e+01 -0.248
## top_herotorbjorn:average.objectiveKillsAvgPer10Min 7.908e+01 -0.287
## top_herotracer:average.objectiveKillsAvgPer10Min 6.257e+01 1.433
## top_herowidowmaker:average.objectiveKillsAvgPer10Min 5.594e+01 -1.398
## top_herowinston:average.objectiveKillsAvgPer10Min 1.275e+02 -1.297
## top_herowreckingBall:average.objectiveKillsAvgPer10Min 5.481e+01 -0.041
## top_herozarya:average.objectiveKillsAvgPer10Min 3.718e+01 0.990
## top_herozenyatta:average.objectiveKillsAvgPer10Min 5.215e+01 1.275
## top_heroana:games_played 6.116e-01 -0.495
## top_heroashe:games_played 7.390e-01 0.314
## top_herobaptiste:games_played 8.498e-01 0.898
## top_herobastion:games_played 1.339e+00 2.172
## top_herobrigitte:games_played 1.291e+00 0.675
## top_herodoomfist:games_played 8.557e-01 1.193
## top_herodVa:games_played 5.989e-01 1.065
## top_herogenji:games_played 5.130e-01 0.380
## top_herohanzo:games_played 6.463e-01 1.097
## top_herojunkrat:games_played 7.814e-01 0.081
## top_herolucio:games_played 5.051e-01 -0.276
## top_heromccree:games_played 5.570e-01 1.818
## top_heromei:games_played 1.348e+00 0.909
## top_heromercy:games_played 4.570e-01 2.539
## top_heromoira:games_played 4.476e-01 2.514
## top_heroorisa:games_played 4.968e-01 1.338
## top_heropharah:games_played 2.014e+00 1.020
## top_heroreaper:games_played 7.564e-01 0.755
## top_heroroadhog:games_played 4.970e-01 0.362
## top_herosoldier76:games_played 7.562e-01 -1.302
## top_herosombra:games_played 1.145e+00 1.537
## top_herosymmetra:games_played 1.177e+00 -0.791
## top_herotorbjorn:games_played 1.043e+00 1.367
## top_herotracer:games_played 9.252e-01 0.140
## top_herowidowmaker:games_played 8.665e-01 0.901
## top_herowinston:games_played 1.070e+00 1.569
## top_herowreckingBall:games_played 6.255e-01 2.304
## top_herozarya:games_played 6.734e-01 -0.362
## top_herozenyatta:games_played 7.331e-01 0.621
## Pr(>|t|)
## (Intercept) < 2e-16 ***
## top_heroana 0.000146 ***
## top_heroashe 0.102839
## top_herobaptiste 0.355311
## top_herobastion 0.529623
## top_herobrigitte 0.237567
## top_herodoomfist 0.404261
## top_herodVa 0.743319
## top_herogenji 0.918699
## top_herohanzo 0.970247
## top_herojunkrat 0.554770
## top_herolucio 0.005191 **
## top_heromccree 0.101364
## top_heromei 0.982361
## top_heromercy 0.004775 **
## top_heromoira 0.029625 *
## top_heroorisa 0.452792
## top_heropharah 0.646232
## top_heroreaper 0.613957
## top_heroroadhog 0.789221
## top_herosoldier76 0.059446 .
## top_herosombra 0.466961
## top_herosymmetra 0.036381 *
## top_herotorbjorn 0.779305
## top_herotracer 0.694518
## top_herowidowmaker 0.622743
## top_herowinston 0.277067
## top_herowreckingBall 0.076165 .
## top_herozarya 0.674966
## top_herozenyatta 0.927802
## best.meleeFinalBlowsMostInGame 0.073168 .
## best.offensiveAssistsMostInGame 0.003393 **
## average.objectiveTimeAvgPer10Min 0.087038 .
## average.allDamageDoneAvgPer10Min 3.02e-08 ***
## average.objectiveKillsAvgPer10Min 0.003700 **
## games_played 0.514609
## top_heroana:best.meleeFinalBlowsMostInGame 0.238130
## top_heroashe:best.meleeFinalBlowsMostInGame 0.872871
## top_herobaptiste:best.meleeFinalBlowsMostInGame 0.415747
## top_herobastion:best.meleeFinalBlowsMostInGame 0.058167 .
## top_herobrigitte:best.meleeFinalBlowsMostInGame 0.153478
## top_herodoomfist:best.meleeFinalBlowsMostInGame 0.673106
## top_herodVa:best.meleeFinalBlowsMostInGame 0.550494
## top_herogenji:best.meleeFinalBlowsMostInGame 0.237692
## top_herohanzo:best.meleeFinalBlowsMostInGame 0.681478
## top_herojunkrat:best.meleeFinalBlowsMostInGame 0.380602
## top_herolucio:best.meleeFinalBlowsMostInGame 0.819853
## top_heromccree:best.meleeFinalBlowsMostInGame 0.135088
## top_heromei:best.meleeFinalBlowsMostInGame 0.885524
## top_heromercy:best.meleeFinalBlowsMostInGame 0.102646
## top_heromoira:best.meleeFinalBlowsMostInGame 0.247532
## top_heroorisa:best.meleeFinalBlowsMostInGame 0.005070 **
## top_heropharah:best.meleeFinalBlowsMostInGame 0.847315
## top_heroreaper:best.meleeFinalBlowsMostInGame 0.486606
## top_heroroadhog:best.meleeFinalBlowsMostInGame 0.634433
## top_herosoldier76:best.meleeFinalBlowsMostInGame 0.918024
## top_herosombra:best.meleeFinalBlowsMostInGame 0.019431 *
## top_herosymmetra:best.meleeFinalBlowsMostInGame 0.126394
## top_herotorbjorn:best.meleeFinalBlowsMostInGame 0.914220
## top_herotracer:best.meleeFinalBlowsMostInGame 0.334878
## top_herowidowmaker:best.meleeFinalBlowsMostInGame 0.437841
## top_herowinston:best.meleeFinalBlowsMostInGame 0.227541
## top_herowreckingBall:best.meleeFinalBlowsMostInGame 0.847933
## top_herozarya:best.meleeFinalBlowsMostInGame 0.793446
## top_herozenyatta:best.meleeFinalBlowsMostInGame 0.001664 **
## top_heroana:best.offensiveAssistsMostInGame 0.761862
## top_heroashe:best.offensiveAssistsMostInGame 0.813546
## top_herobaptiste:best.offensiveAssistsMostInGame 0.197933
## top_herobastion:best.offensiveAssistsMostInGame 0.181854
## top_herobrigitte:best.offensiveAssistsMostInGame 0.168574
## top_herodoomfist:best.offensiveAssistsMostInGame 0.598855
## top_herodVa:best.offensiveAssistsMostInGame 0.779150
## top_herogenji:best.offensiveAssistsMostInGame 0.947580
## top_herohanzo:best.offensiveAssistsMostInGame 0.279300
## top_herojunkrat:best.offensiveAssistsMostInGame 0.340346
## top_herolucio:best.offensiveAssistsMostInGame 0.428529
## top_heromccree:best.offensiveAssistsMostInGame 0.499927
## top_heromei:best.offensiveAssistsMostInGame 0.852911
## top_heromercy:best.offensiveAssistsMostInGame 0.867398
## top_heromoira:best.offensiveAssistsMostInGame 0.089256 .
## top_heroorisa:best.offensiveAssistsMostInGame 0.900647
## top_heropharah:best.offensiveAssistsMostInGame 0.638247
## top_heroreaper:best.offensiveAssistsMostInGame 0.818668
## top_heroroadhog:best.offensiveAssistsMostInGame 0.123595
## top_herosoldier76:best.offensiveAssistsMostInGame 0.460670
## top_herosombra:best.offensiveAssistsMostInGame 0.064655 .
## top_herosymmetra:best.offensiveAssistsMostInGame 0.733620
## top_herotorbjorn:best.offensiveAssistsMostInGame 0.931402
## top_herotracer:best.offensiveAssistsMostInGame 0.321486
## top_herowidowmaker:best.offensiveAssistsMostInGame 0.238827
## top_herowinston:best.offensiveAssistsMostInGame 0.434375
## top_herowreckingBall:best.offensiveAssistsMostInGame 0.054177 .
## top_herozarya:best.offensiveAssistsMostInGame 0.069911 .
## top_herozenyatta:best.offensiveAssistsMostInGame 0.191924
## top_heroana:average.objectiveTimeAvgPer10Min 0.224214
## top_heroashe:average.objectiveTimeAvgPer10Min 0.359589
## top_herobaptiste:average.objectiveTimeAvgPer10Min 0.579347
## top_herobastion:average.objectiveTimeAvgPer10Min 0.865478
## top_herobrigitte:average.objectiveTimeAvgPer10Min 0.662727
## top_herodoomfist:average.objectiveTimeAvgPer10Min 0.945644
## top_herodVa:average.objectiveTimeAvgPer10Min 0.089037 .
## top_herogenji:average.objectiveTimeAvgPer10Min 0.590676
## top_herohanzo:average.objectiveTimeAvgPer10Min 0.775236
## top_herojunkrat:average.objectiveTimeAvgPer10Min 0.631494
## top_herolucio:average.objectiveTimeAvgPer10Min 0.962132
## top_heromccree:average.objectiveTimeAvgPer10Min 0.308974
## top_heromei:average.objectiveTimeAvgPer10Min 0.936532
## top_heromercy:average.objectiveTimeAvgPer10Min 0.396612
## top_heromoira:average.objectiveTimeAvgPer10Min 0.060487 .
## top_heroorisa:average.objectiveTimeAvgPer10Min 0.327948
## top_heropharah:average.objectiveTimeAvgPer10Min 0.014047 *
## top_heroreaper:average.objectiveTimeAvgPer10Min 0.270368
## top_heroroadhog:average.objectiveTimeAvgPer10Min 0.196617
## top_herosoldier76:average.objectiveTimeAvgPer10Min 0.583456
## top_herosombra:average.objectiveTimeAvgPer10Min 0.911960
## top_herosymmetra:average.objectiveTimeAvgPer10Min 0.236973
## top_herotorbjorn:average.objectiveTimeAvgPer10Min 0.417431
## top_herotracer:average.objectiveTimeAvgPer10Min 0.082229 .
## top_herowidowmaker:average.objectiveTimeAvgPer10Min 0.523628
## top_herowinston:average.objectiveTimeAvgPer10Min 0.453770
## top_herowreckingBall:average.objectiveTimeAvgPer10Min 0.022168 *
## top_herozarya:average.objectiveTimeAvgPer10Min 0.053156 .
## top_herozenyatta:average.objectiveTimeAvgPer10Min 0.002450 **
## top_heroana:average.allDamageDoneAvgPer10Min 0.108870
## top_heroashe:average.allDamageDoneAvgPer10Min 0.207802
## top_herobaptiste:average.allDamageDoneAvgPer10Min 0.682654
## top_herobastion:average.allDamageDoneAvgPer10Min 0.083731 .
## top_herobrigitte:average.allDamageDoneAvgPer10Min 0.607428
## top_herodoomfist:average.allDamageDoneAvgPer10Min 0.033064 *
## top_herodVa:average.allDamageDoneAvgPer10Min 0.946383
## top_herogenji:average.allDamageDoneAvgPer10Min 0.011483 *
## top_herohanzo:average.allDamageDoneAvgPer10Min 0.118781
## top_herojunkrat:average.allDamageDoneAvgPer10Min 0.851325
## top_herolucio:average.allDamageDoneAvgPer10Min 0.320625
## top_heromccree:average.allDamageDoneAvgPer10Min 0.418617
## top_heromei:average.allDamageDoneAvgPer10Min 0.337624
## top_heromercy:average.allDamageDoneAvgPer10Min 0.056417 .
## top_heromoira:average.allDamageDoneAvgPer10Min 0.021222 *
## top_heroorisa:average.allDamageDoneAvgPer10Min 0.825919
## top_heropharah:average.allDamageDoneAvgPer10Min 0.592833
## top_heroreaper:average.allDamageDoneAvgPer10Min 0.723484
## top_heroroadhog:average.allDamageDoneAvgPer10Min 0.890825
## top_herosoldier76:average.allDamageDoneAvgPer10Min 0.505355
## top_herosombra:average.allDamageDoneAvgPer10Min 0.763612
## top_herosymmetra:average.allDamageDoneAvgPer10Min 0.266107
## top_herotorbjorn:average.allDamageDoneAvgPer10Min 0.806107
## top_herotracer:average.allDamageDoneAvgPer10Min 0.800340
## top_herowidowmaker:average.allDamageDoneAvgPer10Min 0.020508 *
## top_herowinston:average.allDamageDoneAvgPer10Min 0.083296 .
## top_herowreckingBall:average.allDamageDoneAvgPer10Min 0.724279
## top_herozarya:average.allDamageDoneAvgPer10Min 0.268104
## top_herozenyatta:average.allDamageDoneAvgPer10Min 0.620097
## top_heroana:average.objectiveKillsAvgPer10Min 0.765001
## top_heroashe:average.objectiveKillsAvgPer10Min 0.834350
## top_herobaptiste:average.objectiveKillsAvgPer10Min 0.445960
## top_herobastion:average.objectiveKillsAvgPer10Min 0.311166
## top_herobrigitte:average.objectiveKillsAvgPer10Min 0.116701
## top_herodoomfist:average.objectiveKillsAvgPer10Min 0.043596 *
## top_herodVa:average.objectiveKillsAvgPer10Min 0.993895
## top_herogenji:average.objectiveKillsAvgPer10Min 0.089166 .
## top_herohanzo:average.objectiveKillsAvgPer10Min 0.104570
## top_herojunkrat:average.objectiveKillsAvgPer10Min 0.759870
## top_herolucio:average.objectiveKillsAvgPer10Min 0.038422 *
## top_heromccree:average.objectiveKillsAvgPer10Min 0.919118
## top_heromei:average.objectiveKillsAvgPer10Min 0.738829
## top_heromercy:average.objectiveKillsAvgPer10Min 0.455465
## top_heromoira:average.objectiveKillsAvgPer10Min 0.125641
## top_heroorisa:average.objectiveKillsAvgPer10Min 0.327512
## top_heropharah:average.objectiveKillsAvgPer10Min 0.078510 .
## top_heroreaper:average.objectiveKillsAvgPer10Min 0.254399
## top_heroroadhog:average.objectiveKillsAvgPer10Min 0.990792
## top_herosoldier76:average.objectiveKillsAvgPer10Min 0.275814
## top_herosombra:average.objectiveKillsAvgPer10Min 0.762391
## top_herosymmetra:average.objectiveKillsAvgPer10Min 0.804231
## top_herotorbjorn:average.objectiveKillsAvgPer10Min 0.774228
## top_herotracer:average.objectiveKillsAvgPer10Min 0.151872
## top_herowidowmaker:average.objectiveKillsAvgPer10Min 0.162164
## top_herowinston:average.objectiveKillsAvgPer10Min 0.194669
## top_herowreckingBall:average.objectiveKillsAvgPer10Min 0.967653
## top_herozarya:average.objectiveKillsAvgPer10Min 0.322291
## top_herozenyatta:average.objectiveKillsAvgPer10Min 0.202441
## top_heroana:games_played 0.620527
## top_heroashe:games_played 0.753814
## top_herobaptiste:games_played 0.369084
## top_herobastion:games_played 0.029988 *
## top_herobrigitte:games_played 0.499827
## top_herodoomfist:games_played 0.233113
## top_herodVa:games_played 0.286837
## top_herogenji:games_played 0.703824
## top_herohanzo:games_played 0.272910
## top_herojunkrat:games_played 0.935103
## top_herolucio:games_played 0.782757
## top_heromccree:games_played 0.069215 .
## top_heromei:games_played 0.363590
## top_heromercy:games_played 0.011183 *
## top_heromoira:games_played 0.012003 *
## top_heroorisa:games_played 0.181198
## top_heropharah:games_played 0.307948
## top_heroreaper:games_played 0.450563
## top_heroroadhog:games_played 0.717265
## top_herosoldier76:games_played 0.193025
## top_herosombra:games_played 0.124411
## top_herosymmetra:games_played 0.428800
## top_herotorbjorn:games_played 0.171659
## top_herotracer:games_played 0.888806
## top_herowidowmaker:games_played 0.367603
## top_herowinston:games_played 0.116777
## top_herowreckingBall:games_played 0.021309 *
## top_herozarya:games_played 0.717664
## top_herozenyatta:games_played 0.534503
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 447.3 on 2106 degrees of freedom
## Multiple R-squared: 0.349, Adjusted R-squared: 0.2844
## F-statistic: 5.402 on 209 and 2106 DF, p-value: < 2.2e-16
We wanted a smaller model for better explanatory power so we first tried a backwards search using BIC. However, the adjusted \(R^2\) was lower than the model chosen using a backwards search using AIC.
summary(back_aic)$adj.r.squared
## [1] 0.2631896
summary(back_bic)$adj.r.squared
## [1] 0.2037247
We see here that the model chosen by the AIC backwards search has more explanatory power.
# null model
fit_null = lm(skill_rating ~ 1, data = df)
# model chosen by backwards BIC
fit_full = lm(skill_rating ~ best.meleeFinalBlowsMostInGame +
best.offensiveAssistsMostInGame + average.allDamageDoneAvgPer10Min +
average.objectiveKillsAvgPer10Min + games_played,
data = df)
anova(fit_null, fit_full)
## Analysis of Variance Table
##
## Model 1: skill_rating ~ 1
## Model 2: skill_rating ~ best.meleeFinalBlowsMostInGame + best.offensiveAssistsMostInGame +
## average.allDamageDoneAvgPer10Min + average.objectiveKillsAvgPer10Min +
## games_played
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2315 647231056
## 2 2310 514260974 5 132970082 119.46 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Here we reject the null hypothesis and confirm that the model chosen by using a backwards search using BIC is significant.
# compare BIC with AIC
# model chosen by backwards BIC
fit_null = lm(skill_rating ~ best.meleeFinalBlowsMostInGame +
best.offensiveAssistsMostInGame + average.allDamageDoneAvgPer10Min +
average.objectiveKillsAvgPer10Min + games_played,
data = df)
# model chosen by backwards AIC
fit_full = lm(skill_rating ~ top_hero + best.meleeFinalBlowsMostInGame +
best.offensiveAssistsMostInGame + average.allDamageDoneAvgPer10Min +
average.objectiveKillsAvgPer10Min + games_played + top_hero:average.allDamageDoneAvgPer10Min,
data = df)
anova(fit_null, fit_full)
## Analysis of Variance Table
##
## Model 1: skill_rating ~ best.meleeFinalBlowsMostInGame + best.offensiveAssistsMostInGame +
## average.allDamageDoneAvgPer10Min + average.objectiveKillsAvgPer10Min +
## games_played
## Model 2: skill_rating ~ top_hero + best.meleeFinalBlowsMostInGame + best.offensiveAssistsMostInGame +
## average.allDamageDoneAvgPer10Min + average.objectiveKillsAvgPer10Min +
## games_played + top_hero:average.allDamageDoneAvgPer10Min
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2310 514260974
## 2 2252 463908678 58 50352296 4.2143 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Again, we reject the null hypothesis and confirm that the addition of the interaction predictor top_hero:average.allDamageDoneAvgPer10Min to the model is significant (the model chosen by backwards AIC).
We use 2 ANOVA tests to confirm that our final model is the best.
# null model
fit_null = lm(skill_rating ~ 1, data = df)
# model chosen by backwards BIC
fit_full = lm(skill_rating ~ best.meleeFinalBlowsMostInGame +
best.offensiveAssistsMostInGame + average.allDamageDoneAvgPer10Min +
average.objectiveKillsAvgPer10Min + games_played,
data = df)
anova(fit_null, fit_full)
## Analysis of Variance Table
##
## Model 1: skill_rating ~ 1
## Model 2: skill_rating ~ best.meleeFinalBlowsMostInGame + best.offensiveAssistsMostInGame +
## average.allDamageDoneAvgPer10Min + average.objectiveKillsAvgPer10Min +
## games_played
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2315 647231056
## 2 2310 514260974 5 132970082 119.46 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(fit_full)$adj.r.squared
## [1] 0.2037247
Here we reject the null hypothesis and confirm that the model chosen by using a backwards search using BIC is significant.
# compare BIC with AIC
# model chosen by backwards BIC
fit_null = lm(skill_rating ~ best.meleeFinalBlowsMostInGame +
best.offensiveAssistsMostInGame + average.allDamageDoneAvgPer10Min +
average.objectiveKillsAvgPer10Min + games_played,
data = df)
# model chosen by backwards AIC
fit_full = lm(skill_rating ~ top_hero + best.meleeFinalBlowsMostInGame +
best.offensiveAssistsMostInGame + average.allDamageDoneAvgPer10Min +
average.objectiveKillsAvgPer10Min + games_played + top_hero:average.allDamageDoneAvgPer10Min,
data = df)
anova(fit_null, fit_full)
## Analysis of Variance Table
##
## Model 1: skill_rating ~ best.meleeFinalBlowsMostInGame + best.offensiveAssistsMostInGame +
## average.allDamageDoneAvgPer10Min + average.objectiveKillsAvgPer10Min +
## games_played
## Model 2: skill_rating ~ top_hero + best.meleeFinalBlowsMostInGame + best.offensiveAssistsMostInGame +
## average.allDamageDoneAvgPer10Min + average.objectiveKillsAvgPer10Min +
## games_played + top_hero:average.allDamageDoneAvgPer10Min
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2310 514260974
## 2 2252 463908678 58 50352296 4.2143 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(fit_full)$adj.r.squared
## [1] 0.2631896
Again, we reject the null hypothesis and confirm that the addition of the interaction predictor top_hero:average.allDamageDoneAvgPer10Min to the model is significant (the model chosen by backwards AIC).
The model chosen by AIC has a higher \(R^2\) than the model chosen using BIC. Therefore, our best model is the one chosen by AIC. We’ll now check the assumptions of the model to make sure we can trust the hypothesis tests since we’re interested in finding out what variables best explain skill_rating and how they affect skill_rating.
fit_final = lm(formula = skill_rating ~ top_hero + best.meleeFinalBlowsMostInGame +
best.offensiveAssistsMostInGame + average.allDamageDoneAvgPer10Min +
average.objectiveKillsAvgPer10Min + games_played + top_hero:average.allDamageDoneAvgPer10Min,
data = df_final)
summary(fit_final)
##
## Call:
## lm(formula = skill_rating ~ top_hero + best.meleeFinalBlowsMostInGame +
## best.offensiveAssistsMostInGame + average.allDamageDoneAvgPer10Min +
## average.objectiveKillsAvgPer10Min + games_played + top_hero:average.allDamageDoneAvgPer10Min,
## data = df_final)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1536.3 -289.1 -7.7 275.6 1926.7
##
## Coefficients:
## Estimate
## (Intercept) 1.942e+03
## top_heroana 6.523e+02
## top_heroashe 5.729e+02
## top_herobaptiste 2.608e+02
## top_herobastion 1.824e+01
## top_herobrigitte 2.375e+02
## top_herodoomfist -5.571e+02
## top_herodVa -1.588e+02
## top_herogenji -6.747e+02
## top_herohanzo -2.620e+02
## top_herojunkrat -4.470e+02
## top_herolucio 5.892e+02
## top_heromccree 3.626e+02
## top_heromei 2.393e+01
## top_heromercy 6.269e+02
## top_heromoira 5.574e+02
## top_heroorisa -2.496e+02
## top_heropharah -3.201e+02
## top_heroreaper 2.132e+02
## top_heroroadhog -1.475e+02
## top_herosoldier76 2.511e+02
## top_herosombra -2.677e+02
## top_herosymmetra 5.790e+02
## top_herotorbjorn -3.373e+02
## top_herotracer -4.960e+02
## top_herowidowmaker -6.347e+02
## top_herowinston -3.512e+02
## top_herowreckingBall 1.134e+02
## top_herozarya -4.535e+02
## top_herozenyatta -2.921e+02
## best.meleeFinalBlowsMostInGame 5.395e+01
## best.offensiveAssistsMostInGame 1.000e+01
## average.allDamageDoneAvgPer10Min 1.097e-01
## average.objectiveKillsAvgPer10Min -7.924e+01
## games_played 3.411e-01
## top_heroana:average.allDamageDoneAvgPer10Min -8.339e-02
## top_heroashe:average.allDamageDoneAvgPer10Min -5.207e-02
## top_herobaptiste:average.allDamageDoneAvgPer10Min -8.574e-03
## top_herobastion:average.allDamageDoneAvgPer10Min -3.795e-02
## top_herobrigitte:average.allDamageDoneAvgPer10Min -1.272e-02
## top_herodoomfist:average.allDamageDoneAvgPer10Min 5.079e-02
## top_herodVa:average.allDamageDoneAvgPer10Min -8.625e-03
## top_herogenji:average.allDamageDoneAvgPer10Min 6.103e-02
## top_herohanzo:average.allDamageDoneAvgPer10Min 1.990e-02
## top_herojunkrat:average.allDamageDoneAvgPer10Min 9.355e-03
## top_herolucio:average.allDamageDoneAvgPer10Min -6.996e-02
## top_heromccree:average.allDamageDoneAvgPer10Min -3.874e-02
## top_heromei:average.allDamageDoneAvgPer10Min -2.778e-02
## top_heromercy:average.allDamageDoneAvgPer10Min -7.673e-02
## top_heromoira:average.allDamageDoneAvgPer10Min -5.117e-02
## top_heroorisa:average.allDamageDoneAvgPer10Min 1.903e-02
## top_heropharah:average.allDamageDoneAvgPer10Min 1.528e-02
## top_heroreaper:average.allDamageDoneAvgPer10Min -2.993e-02
## top_heroroadhog:average.allDamageDoneAvgPer10Min 9.379e-03
## top_herosoldier76:average.allDamageDoneAvgPer10Min -4.639e-02
## top_herosombra:average.allDamageDoneAvgPer10Min 3.643e-02
## top_herosymmetra:average.allDamageDoneAvgPer10Min -6.317e-02
## top_herotorbjorn:average.allDamageDoneAvgPer10Min 1.778e-02
## top_herotracer:average.allDamageDoneAvgPer10Min 4.088e-02
## top_herowidowmaker:average.allDamageDoneAvgPer10Min 8.081e-02
## top_herowinston:average.allDamageDoneAvgPer10Min 7.524e-02
## top_herowreckingBall:average.allDamageDoneAvgPer10Min -2.036e-02
## top_herozarya:average.allDamageDoneAvgPer10Min 5.781e-02
## top_herozenyatta:average.allDamageDoneAvgPer10Min 2.948e-02
## Std. Error t value
## (Intercept) 1.499e+02 12.951
## top_heroana 2.191e+02 2.977
## top_heroashe 4.089e+02 1.401
## top_herobaptiste 2.477e+02 1.053
## top_herobastion 3.514e+02 0.052
## top_herobrigitte 2.743e+02 0.866
## top_herodoomfist 5.132e+02 -1.085
## top_herodVa 2.463e+02 -0.645
## top_herogenji 3.127e+02 -2.158
## top_herohanzo 3.012e+02 -0.870
## top_herojunkrat 2.880e+02 -1.552
## top_herolucio 2.186e+02 2.696
## top_heromccree 2.876e+02 1.261
## top_heromei 4.051e+02 0.059
## top_heromercy 1.688e+02 3.713
## top_heromoira 1.960e+02 2.845
## top_heroorisa 2.455e+02 -1.017
## top_heropharah 5.328e+02 -0.601
## top_heroreaper 3.089e+02 0.690
## top_heroroadhog 2.408e+02 -0.613
## top_herosoldier76 3.860e+02 0.651
## top_herosombra 4.351e+02 -0.615
## top_herosymmetra 4.843e+02 1.195
## top_herotorbjorn 5.121e+02 -0.659
## top_herotracer 4.748e+02 -1.045
## top_herowidowmaker 3.531e+02 -1.797
## top_herowinston 6.451e+02 -0.544
## top_herowreckingBall 3.872e+02 0.293
## top_herozarya 3.105e+02 -1.461
## top_herozenyatta 2.793e+02 -1.046
## best.meleeFinalBlowsMostInGame 8.508e+00 6.340
## best.offensiveAssistsMostInGame 1.211e+00 8.259
## average.allDamageDoneAvgPer10Min 1.690e-02 6.490
## average.objectiveKillsAvgPer10Min 6.110e+00 -12.969
## games_played 1.003e-01 3.402
## top_heroana:average.allDamageDoneAvgPer10Min 2.858e-02 -2.918
## top_heroashe:average.allDamageDoneAvgPer10Min 3.866e-02 -1.347
## top_herobaptiste:average.allDamageDoneAvgPer10Min 3.143e-02 -0.273
## top_herobastion:average.allDamageDoneAvgPer10Min 3.137e-02 -1.210
## top_herobrigitte:average.allDamageDoneAvgPer10Min 3.729e-02 -0.341
## top_herodoomfist:average.allDamageDoneAvgPer10Min 5.305e-02 0.957
## top_herodVa:average.allDamageDoneAvgPer10Min 2.653e-02 -0.325
## top_herogenji:average.allDamageDoneAvgPer10Min 3.160e-02 1.931
## top_herohanzo:average.allDamageDoneAvgPer10Min 2.914e-02 0.683
## top_herojunkrat:average.allDamageDoneAvgPer10Min 2.783e-02 0.336
## top_herolucio:average.allDamageDoneAvgPer10Min 2.846e-02 -2.458
## top_heromccree:average.allDamageDoneAvgPer10Min 2.869e-02 -1.350
## top_heromei:average.allDamageDoneAvgPer10Min 4.594e-02 -0.605
## top_heromercy:average.allDamageDoneAvgPer10Min 2.342e-02 -3.277
## top_heromoira:average.allDamageDoneAvgPer10Min 2.513e-02 -2.036
## top_heroorisa:average.allDamageDoneAvgPer10Min 2.543e-02 0.748
## top_heropharah:average.allDamageDoneAvgPer10Min 5.219e-02 0.293
## top_heroreaper:average.allDamageDoneAvgPer10Min 3.080e-02 -0.972
## top_heroroadhog:average.allDamageDoneAvgPer10Min 2.488e-02 0.377
## top_herosoldier76:average.allDamageDoneAvgPer10Min 3.640e-02 -1.274
## top_herosombra:average.allDamageDoneAvgPer10Min 4.892e-02 0.745
## top_herosymmetra:average.allDamageDoneAvgPer10Min 5.276e-02 -1.197
## top_herotorbjorn:average.allDamageDoneAvgPer10Min 4.749e-02 0.374
## top_herotracer:average.allDamageDoneAvgPer10Min 4.936e-02 0.828
## top_herowidowmaker:average.allDamageDoneAvgPer10Min 3.685e-02 2.193
## top_herowinston:average.allDamageDoneAvgPer10Min 8.000e-02 0.940
## top_herowreckingBall:average.allDamageDoneAvgPer10Min 4.300e-02 -0.473
## top_herozarya:average.allDamageDoneAvgPer10Min 3.291e-02 1.756
## top_herozenyatta:average.allDamageDoneAvgPer10Min 3.277e-02 0.899
## Pr(>|t|)
## (Intercept) < 2e-16 ***
## top_heroana 0.002940 **
## top_heroashe 0.161295
## top_herobaptiste 0.292535
## top_herobastion 0.958602
## top_herobrigitte 0.386581
## top_herodoomfist 0.277822
## top_herodVa 0.519279
## top_herogenji 0.031062 *
## top_herohanzo 0.384331
## top_herojunkrat 0.120872
## top_herolucio 0.007077 **
## top_heromccree 0.207522
## top_heromei 0.952895
## top_heromercy 0.000210 ***
## top_heromoira 0.004488 **
## top_heroorisa 0.309311
## top_heropharah 0.548087
## top_heroreaper 0.490084
## top_heroroadhog 0.540110
## top_herosoldier76 0.515382
## top_herosombra 0.538494
## top_herosymmetra 0.232026
## top_herotorbjorn 0.510230
## top_herotracer 0.296210
## top_herowidowmaker 0.072390 .
## top_herowinston 0.586204
## top_herowreckingBall 0.769599
## top_herozarya 0.144281
## top_herozenyatta 0.295848
## best.meleeFinalBlowsMostInGame 2.76e-10 ***
## best.offensiveAssistsMostInGame 2.48e-16 ***
## average.allDamageDoneAvgPer10Min 1.05e-10 ***
## average.objectiveKillsAvgPer10Min < 2e-16 ***
## games_played 0.000681 ***
## top_heroana:average.allDamageDoneAvgPer10Min 0.003558 **
## top_heroashe:average.allDamageDoneAvgPer10Min 0.178155
## top_herobaptiste:average.allDamageDoneAvgPer10Min 0.785009
## top_herobastion:average.allDamageDoneAvgPer10Min 0.226457
## top_herobrigitte:average.allDamageDoneAvgPer10Min 0.733057
## top_herodoomfist:average.allDamageDoneAvgPer10Min 0.338433
## top_herodVa:average.allDamageDoneAvgPer10Min 0.745182
## top_herogenji:average.allDamageDoneAvgPer10Min 0.053583 .
## top_herohanzo:average.allDamageDoneAvgPer10Min 0.494725
## top_herojunkrat:average.allDamageDoneAvgPer10Min 0.736838
## top_herolucio:average.allDamageDoneAvgPer10Min 0.014037 *
## top_heromccree:average.allDamageDoneAvgPer10Min 0.177027
## top_heromei:average.allDamageDoneAvgPer10Min 0.545439
## top_heromercy:average.allDamageDoneAvgPer10Min 0.001067 **
## top_heromoira:average.allDamageDoneAvgPer10Min 0.041891 *
## top_heroorisa:average.allDamageDoneAvgPer10Min 0.454355
## top_heropharah:average.allDamageDoneAvgPer10Min 0.769729
## top_heroreaper:average.allDamageDoneAvgPer10Min 0.331302
## top_heroroadhog:average.allDamageDoneAvgPer10Min 0.706270
## top_herosoldier76:average.allDamageDoneAvgPer10Min 0.202624
## top_herosombra:average.allDamageDoneAvgPer10Min 0.456486
## top_herosymmetra:average.allDamageDoneAvgPer10Min 0.231317
## top_herotorbjorn:average.allDamageDoneAvgPer10Min 0.708171
## top_herotracer:average.allDamageDoneAvgPer10Min 0.407600
## top_herowidowmaker:average.allDamageDoneAvgPer10Min 0.028427 *
## top_herowinston:average.allDamageDoneAvgPer10Min 0.347088
## top_herowreckingBall:average.allDamageDoneAvgPer10Min 0.635930
## top_herozarya:average.allDamageDoneAvgPer10Min 0.079156 .
## top_herozenyatta:average.allDamageDoneAvgPer10Min 0.368491
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 453.9 on 2252 degrees of freedom
## Multiple R-squared: 0.2832, Adjusted R-squared: 0.2632
## F-statistic: 14.13 on 63 and 2252 DF, p-value: < 2.2e-16
diagnostics(fit_final, alpha = 0.01, testit = FALSE)
par(mfrow=c(1,1))
hist(rstandard(fit_final), main='Histogram of standardized residuals')
sw_final = diagnostics(fit_final, alpha = 0.01, plotit = FALSE)
bp_final = bptest(fit_final)
At the level \(\alpha = 0.05\), we fail to reject the \(H_0\) of the Shapiro-Wilk test and find that the residuals don’t violate the normality assumption, with a \(p-value\) of 0.0507572.
Similarly, at the level \(\alpha = 0.05\), we find evidence that the errors are homoskedastic, failing to reject \(H_0\) for the Breusch-Pagan test, with a \(p-value\) of 0.0781113.
So, what should a player who wants to improve their skill rating focus on? We look to our best model to help us.
library(coefplot)
library(dotwhisker)
library(broom)
m1 = tidy(fit_final)
m1 %>%
filter(grepl('top_hero', term) & !(grepl('DoneAvgPer10Min', term))) %>%
mutate(term = str_replace(term, 'top_hero', '') %>% str_to_title()) %>%
dwplot(vline = geom_vline(xintercept = 0, colour = "grey60", linetype = 2)) +
theme_bw() +
theme(legend.title = element_blank()) +
guides(shape='none', colour='none') +
labs(x='Coefficients and confidence intervals', caption = 'Omitted hero is Reinhardt') +
ggtitle('Effect of Choosing Certain Heroes on Skill Rating')
It’s pretty clear that playing Ana, Mercy, Lucio and Moira are associated with higher skill rating. These four heroes are all support heroes which suggests learning how to be a good support hero on your team is a good way to boost your skill rating.
For example, for players who “main” Ana rather than Reinhardt, that is those who play Ana the most, they have a higher skill_rating. Ana players on average have a 652.3073769 higher skill_rating than players who “main” Reinhardt.
So, if you want to get a higher skill_rating, you should consider playing one the four Support heroes: Ana, Lucio, Mercy or Moira.
Looking at the coefficients for our interaction predictor top_hero:average.allDamageDoneAvgPer10Min we see that top_heroana:average.allDamageDoneAvgPer10Min and top_heromercy:average.allDamageDoneAvgPer10Min are both significant at \(\alpha = 0.01\).
We see that the coefficients for top_heroana:average.allDamageDoneAvgPer10Min: -0.0833897 and top_heromercy:average.allDamageDoneAvgPer10Min: -0.0767349 are both negative. This tells us that doing damage as a support character does not boost your skill rating as much as if you were doing damange as a tank.
We can see this by comparing our coefficients:
top_heroana:average.allDamageDoneAvgPer10Min + allDamageDoneAvgPer10Min = 0.0263128average.allDamageDoneAvgPer10Min = 0.1097025Because the top_hero predictor is releveled with Reinhardt (a tank) as the base, we can interpret the above values as such: when playing Reinhardt, the most popular hero, your skill rating benefits more by doing a lot of damage than if you were doing a lot of damage as a Support character (Ana & Mercy).
Now, looking at games_played: 0.3410565, we can see that your skill rating also increases with the number of games you play. Rescaling the coefficient back to it’s orignal units \(e^\beta\) = 1.4064328 we see that your average skill rating goes up by ~1.4064328 points per game played. This makes sense because it is fair to assume that you improve as a player the more you play. Practice always helps!
Our best model shows that if you want to climb the Overwatch skill leaderboard on Playstation 4, you should:
skill_rating should improve.The next step that could improve this analysis would be to track players’ skill_rating over time and track what changes in variables lead to changes in skill_rating. However, for a first analysis of this data by anyone (to the best of our knowledge), we were able to get a good explanatory model of skill in Overwatch to help players focus their efforts and climb the rankings.